/* * $Id: AspectWerkzCTask.java,v 1.8 2005/02/21 08:33:24 avasseur Exp $ * $Date: 2005/02/21 08:33:24 $ */ package org.codehaus.aspectwerkz.compiler; import java.io.File; import java.util.ArrayList; import java.util.List; import java.util.Iterator; import org.apache.tools.ant.BuildException; import org.apache.tools.ant.Task; import org.apache.tools.ant.types.Path; import org.apache.tools.ant.types.Reference; import org.apache.tools.ant.types.FileSet; import org.codehaus.aspectwerkz.transform.inlining.AspectModelManager; /** * AspectWerkzC offline Ant task. * * Use the following parameters to configure the task: * <ul> * <li>verbose: [optional] flag marking the weaver verbosity [true / false]</li> * <li>details: [optional] flag marking the weaver verbosity on matching [true / false, requires verbose=true]</li> * <li>genjp: [optional] flag marking the need to keep the generated jp classes [true / false]</li> * <li>taskverbose: [optional] flag marking the task verbose [true / false]</li> * <li>definition: [optional] path to aspect definition xml file (optional, can be found on the path as META-INF/aop.xml - even several)</li> * <li>aspectmodels: [optional] models FQN list separated by ":" (see AspectModelManager)</li> * </ul> * <p/> * Use the following parameters to configure the classpath and to point to the classes to be weaved. Those can be specified * with nested elements as well / instead: * <ul> * <li>classpath: classpath to use</li> * <li>classpathref: classpath reference to use</li> * <li>targetdir: directory where to find classes to weave</li> * <li>targetpath: classpath where to find classes to weave</li> * <li>targetpathref: classpath reference where to find classes to weave</li> * </ul> * <p/> * Nested elements are similar to the "java" task when you configure a classpath: * <ul> * <li>classpath: Path-like structure for the classpath to be used by the weaver. Similar to "java" task classpath</li> * <li>targetpath: Path-like structure for the class to be weaved</li> * </ul> * <p/> * Some rarely used options are also available: * <ul> * <li>backupdir: directory where to backup original classes during compilation, defautls to ./_aspectwerkzc</li> * <li>preprocessor: fully qualified name of the preprocessor. If not set the default is used.</li> * </ul> * * @author <a href='mailto:the_mindstorm@evolva.ro'>the_mindstorm(at)evolva(dot)ro</a> * @author <a href="mailto:alex AT gnilux DOT com">Alexandre Vasseur</a> */ public class AspectWerkzCTask extends Task { private final static String AW_TRANSFORM_DETAILS = "aspectwerkz.transform.details"; private final static String AW_TRANSFORM_VERBOSE = "aspectwerkz.transform.verbose"; private static final String AW_DEFINITION_FILE = "aspectwerkz.definition.file"; private boolean m_verbose; private boolean m_details; private boolean m_genjp; private boolean m_taskVerbose = false; private String m_aspectModels; private File m_backupdir; private String m_preprocessor; private File m_definitionFile; private Path m_classpath; private Path m_target; //private List m_filesets = new ArrayList(); /** * definition=.. * @param defFile */ public void setDefinition(File defFile) { m_definitionFile = defFile; } /** * verbose=.. * @param verbose */ public void setVerbose(boolean verbose) { m_verbose = verbose; } /** * details=.. * @param details */ public void setDetails(boolean details) { m_details = details; } /** * genjp=.. * @param genjp */ public void setGenjp(boolean genjp) { m_genjp = genjp; } /** * compilerverbose=.. * @param verbose */ public void setTaskVerbose(boolean verbose) { m_taskVerbose = verbose; } /** * aspectmodels=.. * @param aspectModels */ public void setAspectModels(String aspectModels) { m_aspectModels = aspectModels; } //-- <target .., <targetpath.. and targetdir=.. targetpathref=.. public Path createTarget() { if (m_target == null) m_target = new Path(getProject()); return m_target.createPath(); } public void setTargetdir(Path srcDir) { if (m_target == null) m_target = srcDir; else m_target.append(srcDir); } public void setTargetpath(Path targetpath) { if (m_target == null) m_target = targetpath; else m_target.append(targetpath); } public Path createTargetpath() { if (m_target == null) m_target = new Path(getProject()); return m_target.createPath(); } public void setTargetpathRef(Reference r) { createTargetpath().setRefid(r); } /** * backupdir=.. * @param backupDir */ public void setBackupdir(File backupDir) { m_backupdir = backupDir; } /** * preprocessor=.. * @param preprocessorFqn */ public void setPreprocessor(String preprocessorFqn) { m_preprocessor = preprocessorFqn; } //--- classpath public void setClasspath(Path classpath) { if (m_classpath == null) m_classpath = classpath; else m_classpath.append(classpath); } public Path createClasspath() { if (m_classpath == null) m_classpath = new Path(getProject()); return m_classpath.createPath(); } public void setClasspathRef(Reference r) { createClasspath().setRefid(r); } // //---- fileset for source files // public void addFileset(FileSet fileset) { // m_filesets.add(fileset); // } public void execute() throws BuildException { try { if (m_definitionFile!=null && !!m_definitionFile.exists() && !m_definitionFile.isFile()) { throw new BuildException("Definition file provided does not exists"); } AspectWerkzC compiler = new AspectWerkzC(); compiler.setHaltOnError(true); compiler.setVerbose(m_taskVerbose); compiler.setGenJp(m_genjp); compiler.setVerify(false); if (m_definitionFile != null) { System.setProperty(AW_DEFINITION_FILE, m_definitionFile.getAbsolutePath()); } if (m_verbose) { System.setProperty(AW_TRANSFORM_VERBOSE, m_verbose ? "true" : "false"); } if (m_details) { System.setProperty(AW_TRANSFORM_DETAILS, m_details ? "true" : "false"); } if (m_aspectModels != null) { System.setProperty(AspectModelManager.ASPECT_MODELS_VM_OPTION, m_aspectModels); } if (m_backupdir != null && m_backupdir.isDirectory()) { compiler.setBackupDir(m_backupdir.getAbsolutePath()); } if (m_taskVerbose) { System.out.println("Classpath : " + dump(getDirectories(m_classpath))); System.out.println("Target : " + dump(getDirectories(m_target))); System.out.println("Definition : " + m_definitionFile); System.out.println("Backupdir : " + m_backupdir); System.out.println("Preprocessor : " + m_preprocessor); } AspectWerkzC.compile(compiler, getClass().getClassLoader(), m_preprocessor, getDirectories(m_classpath), getDirectories(m_target) ); } catch (Exception e) { e.printStackTrace(); throw new BuildException(e, getLocation()); } } private List getDirectories(Path path) throws BuildException { List dirs = new ArrayList(); if (path == null) return dirs; for (int i = 0; i < path.list().length; i++) { File dir = getProject().resolveFile(path.list()[i]); if (!dir.exists()) { throw new BuildException(" \"" + dir.getPath() + "\" does not exist!", getLocation()); } dirs.add(dir);//.getAbsolutePath()); } return dirs; } private String dump(List strings) { StringBuffer sb = new StringBuffer(); for (Iterator iterator = strings.iterator(); iterator.hasNext();) { Object o = (Object) iterator.next(); sb.append(o.toString()).append(File.pathSeparator); } return sb.toString(); } }